// @ts-nocheck
/**
 * 简化版 SVG图标批处理工具
 *
 * 功能:
 * 1. 扫描图标目录
 * 2. 优化SVG文件
 * 3. 标准化文件名为小写+连字符格式
 * 4. 支持根据文件名模式跳过文件
 *
 * 使用方法:
 * npx tsx scripts/processIcons.ts --dir=src/assets/icons --skip="temp-*,draft-*,icon-old.*"
 */
import fs from "fs";
import path from "path";
import { optimize } from "svgo";
import { Command } from "commander";

// 配置命令行选项
const program = new Command();
program
  .option("-d, --dir <path>", "图标目录", "src/assets/icons")
  .option(
    "-s, --skip <patterns>",
    "跳过处理的文件名模式，以逗号分隔",
    "nf-*.svg"
  )
  .parse(process.argv);

const options = program.opts();
const skipPatterns = options.skip
  ? options.skip.split(",").filter(Boolean)
  : [];

// SVGO 优化配置
const svgoConfig = {
  plugins: [
    {
      name: "preset-default",
      params: {
        overrides: {
          removeViewBox: false, // 保留 viewBox 属性
          cleanupIds: true,
          removeUselessDefs: true,
        },
      },
    },
    "removeDimensions", // 移除宽度和高度
    "removeXMLNS", // 移除 xmlns 属性
    {
      name: "removeAttrs",
      params: {
        attrs: "(fill|fill-opacity|stroke|style)", // 修改: 增加 fill-opacity 属性移除
      },
    },
    "removeStyleElement", // 移除嵌套的 <style> 元素
  ],
};

/**
 * 检查文件名是否应该跳过
 */
function shouldSkip(filename: string): boolean {
  if (!skipPatterns.length) return false;

  for (const pattern of skipPatterns) {
    // 将 * 通配符转换为正则表达式
    const regexPattern = pattern
      .replace(/[.+?^${}()|[\]\\]/g, "\\$&") // 转义正则特殊字符
      .replace(/\*/g, ".*"); // 将 * 转换为 .*

    const regex = new RegExp(`^${regexPattern}$`, "i");

    if (regex.test(filename) || regex.test(path.basename(filename, ".svg"))) {
      return true;
    }
  }

  return false;
}

/**
 * 标准化文件名为大驼峰格式 (my-icon.svg -> MyIcon.svg)
 */
function normalizeFilename(filename: string): string {
  // 先将文件名分隔成单词（通过分隔符如空格、连字符、下划线等）
  return filename
    .split(/[-_\s.]+/)
    .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
    .join("");
}

/**
 * 处理SVG文件
 */
async function processSvgFile(filePath: string): Promise<boolean> {
  const filename = path.basename(filePath);

  // 检查是否跳过
  if (shouldSkip(filename)) {
    console.log(`跳过: ${filename}`);
    return false;
  }

  try {
    const dirname = path.dirname(filePath);

    // 标准化文件名
    const ext = path.extname(filename);
    const baseName = path.basename(filename, ext);
    const normalizedName = normalizeFilename(baseName) + ext;

    // 优化SVG内容
    let svgContent = fs.readFileSync(filePath, "utf-8");
    const originalSize = Buffer.byteLength(svgContent, "utf-8");
    svgContent = optimize(svgContent, svgoConfig).data;

    // 保存结果
    const newPath =
      normalizedName !== filename
        ? path.join(dirname, normalizedName)
        : filePath;

    if (normalizedName !== filename) {
      console.log(`重命名: ${filename} → ${normalizedName}`);
      if (fs.existsSync(filePath)) {
        fs.unlinkSync(filePath);
      }
    }

    fs.writeFileSync(newPath, svgContent, "utf-8");
    console.log(
      `优化: ${filename} (减小 ${(
        ((originalSize - Buffer.byteLength(svgContent, "utf-8")) /
          originalSize) *
        100
      ).toFixed(1)}%)`
    );
    return true;
  } catch (error) {
    console.error(`处理失败: ${filename}`, error);
    return false;
  }
}

/**
 * 主函数
 */
async function main() {
  const iconDir = path.resolve(options.dir);

  if (!fs.existsSync(iconDir)) {
    console.error(`错误: 目录 ${iconDir} 不存在`);
    process.exit(1);
  }

  console.log(
    `处理图标目录: ${iconDir}${
      skipPatterns.length ? ` (跳过: ${skipPatterns.join(", ")})` : ""
    }`
  );

  // 获取并处理SVG文件
  const svgFiles = fs
    .readdirSync(iconDir)
    .filter((file) => file.toLowerCase().endsWith(".svg"))
    .map((file) => path.join(iconDir, file));

  console.log(`找到 ${svgFiles.length} 个SVG图标文件`);

  // 统计处理结果
  const results = await Promise.all(svgFiles.map(processSvgFile));
  const processed = results.filter(Boolean).length;

  console.log(
    `处理完成! 共处理 ${processed} 个文件，跳过 ${
      svgFiles.length - processed
    } 个文件`
  );
}

main().catch((error) => {
  console.error("处理过程中出错:", error);
  process.exit(1);
});
